//1,创建链表，并输入学生信息
func creat()*student{
	var	n int
	var	i int
	p := &student{}
	fmt.Print("请输入总人数：")
	fmt.Scan(&n)
	if n <= 0{
		fmt.Println("人数输入错误！")
		return nil
	}
	fmt.Println("请输入学生的姓名\t学号\t专业")
	fmt.Scan(&p.name)
	fmt.Scan(&p.number)
	fmt.Scan(&p.zhuanye)
	head := p
	for i=0; i < n-1; i++{
		q := &student{}
		fmt.Scan(&q.name)
		fmt.Scan(&q.number)
		fmt.Scan(&q.zhuanye)
		p.next = q
		p = q
		q.next = nil
	}
	p.next = nil
	fmt.Println("学生基本信息已录入")
	fmt.Println("退出学生基本信息录入系统")
	return head
}
//2-1-录入语文成绩
func luruyuwen(head *student)*student{
	p := head
	fmt.Println("请依次输入学生的语文成绩")
	for p != nil{
		fmt.Print(p.name,p.number,p.zhuanye  )
		fmt.Scan(&p.yuwen)
		p = p.next
	}
	fmt.Println("语文成绩录入完毕")
	return head
}
//2-2-录入数学成绩
func lurushuxue(head *student)*student{
	p := head
	fmt.Println("请依次输入学生的数学成绩")
	for p != nil{
		fmt.Print(p.name,p.number,p.zhuanye )
		fmt.Scan("%f",&p.shuxue)
		p = p.next
	}
	fmt.Println("数学成绩录入完毕")
	return head
}
//2-3-录入英语成绩
func luruyingyu(head *student)*student{
	p := head
	fmt.Println("请依次输入学生的英语成绩")
	for p != nil{
		fmt.Print(p.name,p.number,p.zhuanye )
		fmt.Scan("%f",&p.yingyu)
		p = p.next
	}
	fmt.Println("英语成绩录入完毕")
	return head
}
//2-4-录入历史成绩
func lurulishi(head *student)*student{
	p := head
	fmt.Println("请依次输入学生的历史成绩")
	for p != nil{
		fmt.Print(p.name,p.number,p.zhuanye )
		fmt.Scan("%f",&p.lishi)
		p = p.next
	}
	fmt.Println("历史成绩录入完毕")
	return head
}
//2-5-录入程序成绩
func luruchengxu(head *student)*student{
	p := head
	fmt.Println("请依次输入学生的程序成绩")
	for p != nil{
		fmt.Print(p.name,p.number,p.zhuanye )
		fmt.Scan("%f",&p.chengxu)
		p = p.next
	}
	fmt.Println("程序成绩录入完毕")
	return head
}
//2-6-录入体育成绩
func lurutiyu(head *student)*student{
	p := head
	fmt.Println("请依次输入学生的体育成绩")
	for p != nil{
		fmt.Println(p.name,p.number,p.zhuanye )
		fmt.Scan("%f",&p.tiyu)
		p = p.next
	}
	fmt.Println("体育成绩录入完毕")
	return head
}
//2-录入学生各科成绩
func luru(head *student)*student{
	p := head
	var i int
	fmt.Println("进入学生单科成绩录入系统") 
	fmt.Println("录入语文成绩----请按1") 
	fmt.Println("录入数学成绩----请按2") 
	fmt.Println("录入英语成绩----请按3") 
	fmt.Println("录入历史成绩----请按4") 
	fmt.Println("录入程序成绩----请按5") 
	fmt.Println("录入体育成绩----请按6")
	fmt.Println("结束录入----请按0")
	fmt.Scan(&i)
	for i!=0 {
		switch i{
		case 1:
			p = luruyuwen(head)
		case 2:
			p = lurushuxue(head)
		case 3:
			p = luruyingyu(head)
		case 4:
			p = lurulishi(head)
		case 5:
			p = luruchengxu(head)
		case 6:
			p = lurutiyu(head)
		default:
			fmt.Println("error!")
		}
		fmt.Println("进入学生单科成绩录入系统") 
		fmt.Println("录入语文成绩----请按1") 
		fmt.Println("录入数学成绩----请按2") 
		fmt.Println("录入英语成绩----请按3") 
		fmt.Println("录入历史成绩----请按4") 
		fmt.Println("录入程序成绩----请按5") 
		fmt.Println("录入体育成绩----请按6")
		fmt.Println("结束录入----请按0")
		fmt.Scan(&i)
	}
	fmt.Println("录入完毕，退出学生成绩录入系统")
	return p
}

//3-增加学生信息  
func zengjia(head *student){
	var q *student 
	i := 1
	p := head
	for p.next != nil{
		p = p.next
	}
	for i != 0{
		q = &student{}
		fmt.Println("请输入要添加的学生的姓名：")
		fmt.Scan(&q.name)
		fmt.Println("请输入学号：")
		fmt.Scan(&q.number)
		fmt.Println("请输入专业:")
		fmt.Scan(&q.zhuanye)
        fmt.Println("请输入语文成绩:")
		fmt.Scan(&q.yuwen)
		fmt.Println("请输入数学成绩:")
		fmt.Scan(&q.shuxue)
		fmt.Println("请输入英语成绩:")
		fmt.Scan(&q.yingyu)
		fmt.Println("请输入历史成绩:")
		fmt.Scan(&q.lishi)
		fmt.Println("请输入程序成绩:")
		fmt.Scan(&q.chengxu)
		fmt.Println("请输入体育成绩:")
		fmt.Scan(&q.tiyu)
		q.next = nil													//将输入的这名学生的指针域赋为NULL 
		p.next = q															//将这名学生的信息域赋给前一个同学p的指针域 
		fmt.Println("已新增学生信息")
		fmt.Println("如果输入0 则不再录入   如果输入1 则继续录入")
		fmt.Scan(&i)
	}
	fmt.Println("增加完毕，退出学生信息增加系统")
}

//4-删除学生信息
func shanchu(head *student)*student{
	var t *student 
	p := head
	var name string
	var number int
	if(head == nil){
		fmt.Println("error")
		return head
	}
	fmt.Println("请输入你想要删除的学生的姓名：")
	fmt.Scan(&name)
	fmt.Println("请输入你想要删除的学生的学号：")
	fmt.Scan(&number)
	if(p.name == name&&p.number == number){
		fmt.Println("你即将删除的学生的信息如下")
		fmt.Println("姓名\t学号\t专业\t语文\t数学\t英语\t历史\t程序\t体育")
		fmt.Println(p.name,p.number,p.zhuanye,p.yuwen,p.shuxue,
										p.yingyu,p.lishi,p.chengxu,p.tiyu)
		p = p.next
		head = p
		fmt.Println("删除成功")
	}else{
		p = p.next
		for p.next != nil&&p.name != name&&p.number != number{
			t = p
			p = p.next
		}
		if(p.name == name&&p.number == number){
			fmt.Println("你即将删除的学生的信息如下")
			fmt.Println("姓名\t学号\t专业\t语文\t数学\t英语\t历史\t程序\t体育")
			fmt.Println(p.name,p.number,p.zhuanye,p.yuwen,p.shuxue,
										p.yingyu,p.lishi,p.chengxu,p.tiyu)
			p = p.next
			t.next = p
			fmt.Println("删除成功")
		}else{
			fmt.Println("没有这号人！")
		}
	}
	fmt.Println("退出学生信息删除系统")
	return head
}
//5-通过姓名和学号去修改学生数据
func xiugai(head *student)*student{
	if(head == nil){
		fmt.Println("error!")
		return nil
	}
	var name string
	var number int
	p := head
	fmt.Println("请输入你想修改的人的姓名：")
	fmt.Scan(&name)
	fmt.Println("请输入你想修改的人的学号：")
	fmt.Scan(&number)
	for name!=p.name && number!=p.number{
		p = p.next
	}
	if(name == p.name && number == p.number){
		fmt.Println("你要修改的学生信息为:")
		fmt.Println("姓名\t学号\t专业\t语文\t数学\t英语\t历史\t程序\t体育")
		fmt.Println(p.name,p.number,p.zhuanye,p.yuwen,p.shuxue,p.yingyu,p.lishi,p.chengxu,p.tiyu)
		fmt.Println("请修改姓名: ")
		fmt.Scan(&p.name)
		fmt.Println("请修改学号: ")
		fmt.Scan(&p.number)
		fmt.Println("请修改语文成绩: ")
		fmt.Scan(&p.yuwen)
		fmt.Println("请修改数学成绩: ")
		fmt.Scan(&p.shuxue)
		fmt.Println("请修改英语成绩: ")
		fmt.Scan(&p.yingyu)
		fmt.Println("请修改历史成绩: ")
		fmt.Scan(&p.lishi)
		fmt.Println("请修改程序成绩: ")
		fmt.Scan(&p.chengxu)
		fmt.Println("请修改体育成绩: ")
		fmt.Scan(&p.tiyu)
		fmt.Println("成绩已经更新完毕")
		fmt.Println("更新完的学生信息为：")
		fmt.Println(p.name,p.number,p.zhuanye,p.yuwen,p.shuxue,p.yingyu,p.lishi,p.chengxu,p.tiyu)	
	}else{
		fmt.Println("没有这号人")
	}
	fmt.Println("退出学生信息修改系统")
	return head
}

//6-1-查询语文成绩排名
func cxyuwen(head *student)(){
	if(head == nil){
		fmt.Println("error!")
		return 
	}
	var tscore [200000]float32
	var tnumber [200000]int
	var tname [200000]string
	var yscore float32
	var ynumber int
	var yname string
	n := 0
	p := head
	for p != nil{
		tscore[n] = p.yuwen
		tnumber[n] = p.number
		tname[n] = p.name
		p = p.next
		n++
	}
	for i := 0; i<n; i++{
		for j := i+1; j<n; j++{
			if(tscore[i]<tscore[j]){
				yscore = tscore[i]		
				ynumber = tnumber[i]    
				yname = tname[i]
				tscore[i] = tscore[j]	
				tnumber[i] = tnumber[j] 
				tname[i] = tname[j]
				tscore[j] = yscore		
				tnumber[j] = ynumber	
				tname[j] = yname
			}
		}
	}
	fmt.Println("排名完毕")
	fmt.Println("语文成绩排名如下：")
	fmt.Println("姓名 学号 专业 语文成绩 排名：")
	for k := 0; k<n; k++{
		fmt.Println(tname[k],tnumber[k],tscore[k],k+1)
	}
	fmt.Println("语文成绩排名输出完毕")
}

//6-2-查询数学成绩排名
func cxshuxue(head *student)(){
	if(head == nil){
		fmt.Println("error!")
		return 
	}
	var tscore [200000]float32
	var tnumber [200000]int
	var tname [200000]string
	var yscore float32
	var ynumber int
	var yname string
	n := 0
	p := head
	for p != nil{
		tscore[n] = p.shuxue
		tnumber[n] = p.number
		tname[n] = p.name
		p = p.next
		n++
	}
	for i := 0; i<n; i++{
		for j := i+1; j<n; j++{
			if(tscore[i]<tscore[j]){
				yscore = tscore[i]		
				ynumber = tnumber[i]    
				yname = tname[i]
				tscore[i] = tscore[j]	
				tnumber[i] = tnumber[j] 
				tname[i] = tname[j]
				tscore[j] = yscore		
				tnumber[j] = ynumber	
				tname[j] = yname
			}
		}
	}
	fmt.Println("排名完毕")
	fmt.Println("数学成绩排名如下：")
	fmt.Println("姓名 学号 专业 数学成绩 排名：")
	for k := 0; k<n; k++{
		fmt.Println(tname[k],tnumber[k],tscore[k],k+1)
	}
	fmt.Println("数学成绩排名输出完毕")
}

//6-3-查询英语成绩排名
func cxyingyu(head *student)(){
	if(head == nil){
		fmt.Println("error!")
		return 
	}
	var tscore [200000]float32
	var tnumber [200000]int
	var tname [200000]string
	var yscore float32
	var ynumber int
	var yname string
	n := 0
	p := head
	for p != nil{
		tscore[n] = p.yingyu
		tnumber[n] = p.number
		tname[n] = p.name
		p = p.next
		n++
	}
	for i := 0; i<n; i++{
		for j := i+1; j<n; j++{
			if(tscore[i]<tscore[j]){
				yscore = tscore[i]		
				ynumber = tnumber[i]    
				yname = tname[i]
				tscore[i] = tscore[j]	
				tnumber[i] = tnumber[j] 
				tname[i] = tname[j]
				tscore[j] = yscore		
				tnumber[j] = ynumber	
				tname[j] = yname
			}
		}
	}
	fmt.Println("排名完毕")
	fmt.Println("英语成绩排名如下：")
	fmt.Println("姓名 学号 专业 英语成绩 排名：")
	for k := 0; k<n; k++{
		fmt.Println(tname[k],tnumber[k],tscore[k],k+1)
	}
	fmt.Println("英语成绩排名输出完毕")
}

//6-4-查询历史成绩排名
func cxlishi(head *student)(){
	if(head == nil){
		fmt.Println("error!")
		return 
	}
	var tscore [200000]float32
	var tnumber [200000]int
	var tname [200000]string
	var yscore float32
	var ynumber int
	var yname string
	n := 0
	p := head
	for p != nil{
		tscore[n] = p.lishi
		tnumber[n] = p.number
		tname[n] = p.name
		p = p.next
		n++
	}
	for i := 0; i<n; i++{
		for j := i+1; j<n; j++{
			if(tscore[i]<tscore[j]){
				yscore = tscore[i]		
				ynumber = tnumber[i]    
				yname = tname[i]
				tscore[i] = tscore[j]	
				tnumber[i] = tnumber[j] 
				tname[i] = tname[j]
				tscore[j] = yscore		
				tnumber[j] = ynumber	
				tname[j] = yname
			}
		}
	}
	fmt.Println("排名完毕")
	fmt.Println("历史成绩排名如下：")
	fmt.Println("姓名 学号 专业 历史成绩 排名：")
	for k := 0; k<n; k++{
		fmt.Println(tname[k],tnumber[k],tscore[k],k+1)
	}
	fmt.Println("历史成绩排名输出完毕")
}

//6-5-查询程序成绩排名
func cxchengxu(head *student)(){
	if(head == nil){
		fmt.Println("error!")
		return 
	}
	var tscore [200000]float32
	var tnumber [200000]int
	var tname [200000]string
	var yscore float32
	var ynumber int
	var yname string
	n := 0
	p := head
	for p != nil{
		tscore[n] = p.chengxu
		tnumber[n] = p.number
		tname[n] = p.name
		p = p.next
		n++
	}
	for i := 0; i<n; i++{
		for j := i+1; j<n; j++{
			if(tscore[i]<tscore[j]){
				yscore = tscore[i]		
				ynumber = tnumber[i]    
				yname = tname[i]
				tscore[i] = tscore[j]	
				tnumber[i] = tnumber[j] 
				tname[i] = tname[j]
				tscore[j] = yscore		
				tnumber[j] = ynumber	
				tname[j] = yname
			}
		}
	}
	fmt.Println("排名完毕")
	fmt.Println("程序成绩排名如下：")
	fmt.Println("姓名 学号 专业 程序成绩 排名：")
	for k := 0; k<n; k++{
		fmt.Println(tname[k],tnumber[k],tscore[k],k+1)
	}
	fmt.Println("程序成绩排名输出完毕")
}

//6-6-查询体育成绩排名
func cxtiyu(head *student)(){
	if(head == nil){
		fmt.Println("error!")
		return 
	}
	var tscore [200000]float32
	var tnumber [200000]int
	var tname [200000]string
	var yscore float32
	var ynumber int
	var yname string
	n := 0
	p := head
	for p != nil{
		tscore[n] = p.tiyu
		tnumber[n] = p.number
		tname[n] = p.name
		p = p.next
		n++
	}
	for i := 0; i<n; i++{
		for j := i+1; j<n; j++{
			if(tscore[i]<tscore[j]){
				yscore = tscore[i]		
				ynumber = tnumber[i]    
				yname = tname[i]
				tscore[i] = tscore[j]	
				tnumber[i] = tnumber[j] 
				tname[i] = tname[j]
				tscore[j] = yscore		
				tnumber[j] = ynumber	
				tname[j] = yname
			}
		}
	}
	fmt.Println("排名完毕")
	fmt.Println("体育成绩排名如下：")
	fmt.Println("姓名 学号 专业 体育成绩 排名：")
	for k := 0; k<n; k++{
		fmt.Println(tname[k],tnumber[k],tscore[k],k+1)
	}
	fmt.Println("体育成绩排名输出完毕")
}
//6-查询某一科的成绩排名 
func cxpaiming(head *student)(){
	p :=head
	var i int
	fmt.Println("查询语文成绩排名请按1")
	fmt.Println("查询数学成绩排名请按2")
	fmt.Println("查询英语成绩排名请按3")
	fmt.Println("查询历史成绩排名请按4")
	fmt.Println("查询程序成绩排名请按5")
	fmt.Println("查询体育成绩排名请按6")
	fmt.Println("结束查询请按0")
	fmt.Scan(&i)
	for i != 0{
		switch i{
		case 1:
			cxyuwen(p)
		case 2:
			cxshuxue(p)
		case 3:
			cxyingyu(p)
		case 4:
			cxlishi(p)
		case 5:
			cxchengxu(p)
		case 6:
			cxtiyu(p)
		default:
			fmt.Println("error!")
		}
		fmt.Println("查询语文成绩排名请按1")
		fmt.Println("查询数学成绩排名请按2")
		fmt.Println("查询英语成绩排名请按3")
		fmt.Println("查询历史成绩排名请按4")
		fmt.Println("查询程序成绩排名请按5")
		fmt.Println("查询体育成绩排名请按6")
		fmt.Println("结束查询请按0")
		fmt.Scan(&i)
	}
	fmt.Println("退出查询学生成绩排名系统")
}


//7-查询学生成绩
func chaxunchengji(head *student)(){
	var name string
	var number int
	if(head == nil){
		fmt.Println("error!")
		return
	}
	fmt.Print("请输入要查询的学生的姓名：")
	fmt.Scan(&name)
	fmt.Println("请输入要查询的学生的学号：")
	fmt.Scan(&number)
	p := head
	q := p.next
	if(name == p.name&&number == p.number){
		fmt.Println("查询的学生信息为:")
		fmt.Println("姓名\t学号\t专业\t语文\t数学\t英语\t历史\t程序\t体育")
		fmt.Println(p.name,p.number,p.zhuanye,p.yuwen,p.shuxue,
				p.yingyu,p.lishi,p.chengxu,p.tiyu)
	}else{
		for q.next!=nil&&q.name!=name&&number!=p.number{
			q = q.next
		}
		if(q!=nil){
			fmt.Println("查询的学生信息为:")
			fmt.Println("姓名\t学号\t专业\t语文\t数学\t英语\t历史\t程序\t体育")
			fmt.Println(q.name,q.number,q.zhuanye,q.yuwen,q.shuxue,
							q.yingyu,q.lishi,q.chengxu,q.tiyu)
		}else{
			fmt.Println("没有这一号人")
		}
	}
	fmt.Println("退出某一学生信息查询系统")
}

//8-统计所有不及格科目超过两科的学生名单
func bujige(head *student)(){
	p :=head
	sum := 0
	if(head==nil){
		fmt.Println("error!")
		return 
	}
	fmt.Println("以下为不及格目超过两科的学生名单")
	fmt.Println("姓名\t学号\t专业\t语文\t数学\t英语\t历史\t程序\t体育")
	for p!=nil{
		if(p.yuwen<60){
			sum++
		}
		if(p.shuxue<60){
			sum++
		}
		if(p.yingyu<60){
			sum++
		}
		if(p.lishi<60){
			sum++
		}
		if(p.chengxu<60){
			sum++
		}
		if(p.tiyu<60){
			sum++
		}
		if(sum>2){
			fmt.Println(p.name,p.number,p.zhuanye,p.yuwen,p.shuxue,
							p.yingyu,p.lishi,p.chengxu,p.tiyu)
		}
		sum = 0
		p = p.next
	}
	fmt.Println("不及格科目超过两科的学生名单如上")
}

//9-输出学生信息
func put(head *student){
	p :=head
	if(head == nil){
		fmt.Println("error!")
	}
	fmt.Println("当前学生信息结果如下")
	fmt.Println("姓名\t学号\t专业\t语文\t数学\t英语\t历史\t程序\t体育")
	for p != nil{
		fmt.Println(p.name,p.number,p.zhuanye,p.yuwen,p.shuxue,
						p.yingyu,p.lishi,p.chengxu,p.tiyu)
		p = p.next
	}
	fmt.Println("学生信息输出完毕")
}